﻿/*=============================================================================
* File Name : Math.cpp                          Ver : 1.00  Date : 2009-10-23
*
* Description :
*
*       数学基本計算　ソース．
*
* Author : 土田　悠貴．
*============================================================================*/
#include "Math.h"
#include <cmath>
#include <cstdio>
#include <ctime>
#include <cstdlib>

namespace tglib
{

/*==== 定数宣言 =============================================================*/

/** 円周率 */
const float Math::PI = 3.1415926535897932f;


/*===========================================================================*/
/**
 * 線形補間をする(aは0.0～1.0)．
 *
 * @param [in] a  補間したい値(0.0～1.0) ．
 * @param [in] l  最少値 ．
 * @param [in] h  最大値 ．
 * @return   補間した値．
 */
float Math::LERP( float a, float l, float h )
{
	return ( (l) + ( ( (h) - (l) ) * (a) ) );
}

/*===========================================================================*/
/**
 * 二次補間する(aは0.0～1.0)．
 *
 * @param [in] a  補間したい値(0.0～1.0) ．
 * @param [in] v1  補間値1 ．
 * @param [in] v2  補間値2 ．
 * @param [in] v3  補間値3 ．
 * @return   補間した値．
 */
float Math::QUADRATIC( float a, float v1, float v2, float v3 )
{
	return (v1) * ( 1.0f - (a) )
				* ( 1.0f - (a) ) 
				+ 2 * (v2) * (a) 
				* ( 1.0f - (a) ) 
				+ (v3) * (a) * (a);
}

/*===========================================================================*/
/**
 * 乱数の初期化．
 */
void Math::Randamize()
{
	( srand( ( unsigned int )time( NULL ) ), srand( rand() ) );
}

/*===========================================================================*/
/**
 * 乱数値を求める．
 *
 * @param [in] min  乱数の最小値 ．
 * @param [in] max  乱数の最大値．
 * @return   求めた乱数を返す．
 */
int Math::Rand( int min, int max )
{
	return ( ( rand() % (int)( (max) - (min) + 1 ) ) + (int)(min) );
}

/*===========================================================================*/
/**
 * 浮動小数点の乱数値を求める．
 *
 * @param [in] min  乱数の最小値 ．
 * @param [in] max  乱数の最大値．
 * @return   求めた乱数を返す．
 */
float Math::Randf( float min, float max )
{
	return ( static_cast<float>( rand() / RAND_MAX ) * ( (max) - (min) + (min) ) );
}

/*===========================================================================*/
/**
 * 平方根を求める．
 *
 * @param [in] min  平方根を求めたい値 ．
 * @return   求めた平方根．
 */
float Math::Sqrt( float x )
{
	return ( static_cast<float>(std::sqrt( x ) ) );
}

/*===========================================================================*/
/**
 * 正弦を求める．
 *
 * @param [in] deg  角度 ．
 * @return   正弦．
 */
float Math::Sin( float deg )
{
	return ( static_cast<float>( std::sin( DegToRad( deg ) ) ) );
}

/*===========================================================================*/
/**
 * 余弦を求める．
 *
 * @param [in] deg  角度 ．
 * @return   余弦．
 */
float Math::Cos( float deg )
{
	return ( static_cast<float>( std::cos( DegToRad( deg ) ) ) );
}

/*===========================================================================*/
/**
 * 正接を求める．
 *
 * @param [in] deg  角度 ．
 * @return   正接．
 */
float Math::Tan( float deg )
{
	return ( static_cast<float>( std::tan( DegToRad( deg ) ) ) );
}

/*===========================================================================*/
/**
 * 逆正弦を求める．
 *
 * @param [in] deg  正弦．
 * @return   逆正弦．
 */
float Math::Asin( float deg )
{
	return ( static_cast<float>( RadToDeg( std::asin( deg ) ) ) );
}

/*===========================================================================*/
/**
 * 逆余弦を求める．
 *
 * @param [in] deg  余弦 ．
 * @return   逆余弦．
 */
float Math::Acos( float deg )
{
	return ( static_cast<float>( RadToDeg( std::acos( deg ) ) ) );
}

/*===========================================================================*/
/**
 * 逆正接を求める．
 *
 * @param [in] deg1  y座標．
 * @param [in] deg2  x座標．
 * @return   逆正接．
 */
float Math::Atan( float deg1, float deg2 )
{
	return ( static_cast<float>( DegreeNormalize( RadToDeg( std::atan2( deg1, deg2 ) ) ) ) );
}

/*===========================================================================*/
/**
 * ラジアンを求める．
 *
 * @param [in] deg  角度 ．
 * @return   ラジアン．
 */
float Math::DegToRad( float deg )
{
	return ( (deg) * ( 1.0f / 180.0f * PI ) );
}

/*===========================================================================*/
/**
 * 角度を求める．
 *
 * @param [in] rad  ラジアン ．
 * @return   角度．
 */
float Math::RadToDeg( float rad )
{
	return ( (rad) * (1.0f / PI * 180.0f ) );
}

/*===========================================================================*/
/**
 * 正規化した角度を求める．
 *
 * @param [in] rad  角度 ．
 * @return   正規化した角度．
 */
float Math::DegreeNormalize( float rad )
{
	return ( ( (rad) >= 0.0f ) ? ( static_cast<float>(std::fmod( rad, 360.0f ) ) )
			   : ( static_cast<float>( std::fmod( rad, 360.0f ) ) + 360.0f ) );
}

} // namespace tglib

/********** End of File ******************************************************/
